package rhplus.persistencia;

import java.io.Serializable;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import rhplus.acessoBD.PMF;
import rhplus.gestor.UtensiliosParaDatas;
import rhplus.utilizador.Pessoa;
import rhplus.utilizador.Colaborador;

@PersistenceCapable
public class Hospital implements Serializable {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    protected Long id_hospital;
    @Persistent
    protected String nome;
    @Persistent
    protected int numero_na_rede;
    @Persistent
    protected String cidade;
    @Persistent
    protected String morada;
    @Persistent
    protected int telefone;
    @Persistent
    protected String director;
    @Persistent
    protected Long id_codigo_postal;

    /** Creates a new instance of Hospital */
    public Hospital(final String nome, final int numero_na_rede,
            final String cidade, final String morada, final int telefone,
            final String director, final Long codigo_postal) {

        this.nome = nome;
        this.numero_na_rede = numero_na_rede;
        this.cidade = cidade;
        this.morada = morada;
        this.telefone = telefone;
        this.director = director;
        this.id_codigo_postal = codigo_postal;
    }

    public static void removeMensagem(Long id_mensagem) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public static void removeHistoricoInternamento(Long id_internamento) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public static boolean temContracto(Long id_pessoa) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + Pessoa.class.getName()
                + " where id_pessoa == " + id_pessoa;

        List<Pessoa> lista = (List<Pessoa>) pm.newQuery(query).execute();

        String nome = lista.get(0).getNome();

        if (nome.contains("CONTRATOEXPIRADO")) {
            return false;
        }
        return true;
    }

    public Long getIdHospital() {
        return id_hospital;
    }

    public String getNome() {
        return nome;
    }

    public int getNumeroNaRede() {
        return numero_na_rede;
    }

    public String getCidade() {
        return cidade;
    }

    public String getMorada() {
        return morada;
    }

    public int getTelefone() {
        return telefone;
    }

    public String getDirector() {
        return director;
    }

    public Long getCodigoPostal() {
        return id_codigo_postal;
    }

    public void setNome(final String nome) {
        this.nome = nome;
    }

    public void setNumeroNaRede(final int numero_na_rede) {
        this.numero_na_rede = numero_na_rede;
    }

    public void setCidade(final String cidade) {
        this.cidade = cidade;
    }

    public void setMorada(final String morada) {
        this.morada = morada;
    }

    public void setTelefone(final int telefone) {
        this.telefone = telefone;
    }

    public void setDirector(final String director) {
        this.director = director;
    }

    public void setCodigoPostal(final Long codigo_postal) {
        this.id_codigo_postal = codigo_postal;
    }

    public void setId(Long id_h) {
        this.id_hospital = id_h;
    }

    //Devolve Hospital através do ID
    public static Hospital devolve(Long id_hospital) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + Hospital.class.getName()
                + " where id_hospital == " + id_hospital;

        Hospital hospital = ((List<Hospital>) pm.newQuery(query).execute()).get(0);

        return hospital;

    }

    public static LinkedList<String> lista_horarios() {
        LinkedList<String> lista = new LinkedList<String>();
        lista.add("2:00-8:00");
        lista.add("8:00-14:00");
        lista.add("14:00-20:00");
        lista.add("20:00-2:00");
        return lista;
    }

    public static LinkedList<String> lista_especialidades() {
        LinkedList<String> lista = new LinkedList<String>();
        lista.add("Clinica Geral");
        lista.add("Urologia");
        lista.add("Ginecologia");
        lista.add("Pediatria");
        lista.add("Cardiologia");
        lista.add("Otorinolaringologia");
        lista.add("Dentista");
        lista.add("Psiquiatria");
        lista.add("Psicologia");
        lista.add("Obstetricia");
        lista.add("Oftalmologia");
        lista.add("Neurologia");
        lista.add("Dermatologia");
        return lista;
    }

    //Verifica se existe Hospital através do ID
    public static boolean existeHospital(Long id_hospital) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + Hospital.class.getName()
                + " where id_hospital == " + id_hospital;

        return ((List<Hospital>) pm.newQuery(query).execute()).size() > 0;
    }

    public static LinkedList<Hospital> devolveTodos() {

        String query = "select from " + Hospital.class.getName();
        PersistenceManager pm = PMF.get().getPersistenceManager();
        List<Hospital> lista_de_hospitais = (List<Hospital>) pm.newQuery(query).execute();

        LinkedList<Hospital> lista = new LinkedList<Hospital>();
        for (Hospital h : lista_de_hospitais) {
            lista.add(h);
        }

        return lista;
    }

    public static void insere(final Hospital hospital) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.makePersistent(hospital);
        } finally {
            pm.close();
        }
    }

    public static void altera(final Hospital hospital) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.currentTransaction().begin();

            Hospital hospital_novo = pm.getObjectById(Hospital.class, hospital.getIdHospital());
            hospital_novo.setAll(hospital);

            pm.makePersistent(hospital_novo);
            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public void setAll(Hospital u) {
        this.nome = u.getNome();
        this.numero_na_rede = u.getNumeroNaRede();
        this.cidade = u.getCidade();
        this.morada = u.getMorada();
        this.telefone = u.getTelefone();
        this.director = u.getDirector();
        this.id_codigo_postal = u.getCodigoPostal();
    }

    public static void remove(final int id_hospital) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.currentTransaction().begin();

            Hospital hospital_novo = pm.getObjectById(Hospital.class, id_hospital);
            pm.deletePersistent(hospital_novo);


            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public static List<Hospital> devolveHistoricoInternamentos(Long id_pessoa) {
        // A FAZER
        return null;
    }

    public static LinkedList<Hospital> devolveHospitalPorEspecialidade(final String especialidade) {

        List<Colaborador> colab = Colaborador.devolveTodos();
        LinkedList<Hospital> novaColab = new LinkedList<Hospital>();

        for (Colaborador c : colab) {
            if (c.getEspecialidade().equals(especialidade)) {
                Hospital h = Hospital.devolve(c.getIdHospital());
                if (!novaColab.contains(h)) {
                    novaColab.add(h);
                }
            }
        }

        return novaColab;
    }

    public static LinkedList<Colaborador> devolveMedicosDaEspecialidade(final Long id_hospital, final String especialidade) {

        // DEVOLVE LISTA DE TODOS OS MEDICOS COM ESPECIALIDADE E HOSPITAL IGUAL AOS ARGUMENTOS
        List<Colaborador> colab = Colaborador.devolveTodos();
        LinkedList<Colaborador> novaColab = new LinkedList<Colaborador>();

        for (Colaborador c : colab) {
            if (c.getEspecialidade() != null) {
                if (c.getEspecialidade().equals(especialidade) && c.getIdHospital() == id_hospital) {
                    novaColab.add(c);
                } else if (c.getIdHospital2() == id_hospital && c.getEspecialidade().equals(especialidade)) {
                    novaColab.add(c);
                }
            }
        }
        return novaColab;
    }
}
